
package com.eworking.eim.message;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.eworking.eim.user.EIMUser;
import com.eworking.eim.util.EIMLog;

public class EIMConversation {
    
    /** 日志输出标记 */
    private static final String _TAG = EIMConversation.class.getSimpleName();
    
    /** 当前会话的消息集合 */
    private List<EIMMessage> messages;
    
    /** 未读的消息数量 */
    private int unreadMsgCount = 0;
    
    /** 对方登陆账号 或群组ID */
    private String account;
    
    /** 当前会话是否群组聊天 */
    private boolean isGroup = false;
    
    /** 对方用户信息 */
    private EIMUser otherUser = null;
    
    public EIMConversation(String account) {
        this.account = account;
        if (this.messages == null) {
            this.messages = Collections.synchronizedList(new ArrayList<EIMMessage>());
        }
    }
    
    public EIMConversation(String account, List<EIMMessage> messages) {
        this.account = account;
        if (this.messages == null) {
            this.messages = Collections.synchronizedList(messages);
        }
    }
    
    /**
     * 添加消息到当前会话中
     * 
     * @param message 消息信息
     */
    public void addMessage(EIMMessage message) {
        if (this.messages.size() > 0) {
            // 判断当前会话是否已存在该条消息
            EIMMessage lastMessage = this.messages.get(this.messages.size() - 1);
            if ((message.getMsgId() != null) && (lastMessage.getMsgId() != null)
                && (message.getMsgId().equals(lastMessage.getMsgId())))
                return;
        }
        // 将消息放入到缓存中
        this.messages.add(message);
        // 如果接收到的消息未读，则未读数量+1
        if ((message.direct == EIMMessage.Direct.RECEIVE) && (message.isUnread())) {
            this.unreadMsgCount += 1;
        }
    }
    
    /**
     * 从数据库中加载消息
     * 
     * @param msgId 消息ID
     * @param limit 加载条数
     * @return
     */
    public List<EIMMessage> loadMsgFromDB(String msgId, int limit) {
        List<EIMMessage> tempMessages = EIMMessageTable.getInstance().queryMessages(this.account, msgId, limit);
        this.messages.addAll(0, tempMessages);
        return tempMessages;
    }
    
    /**
     * 加载群组消息
     * 
     * @param msgId 消息ID
     * @param limit 加载条数
     * @return
     */
    public List<EIMMessage> loadGroupMsgFromDB(String msgId, int limit) {
        List<EIMMessage> tempMessages = EIMMessageTable.getInstance().queryGroupMessages(this.account, msgId, limit);
        this.messages.addAll(0, tempMessages);
        return tempMessages;
    }
    
    /**
     * 根据下标获取消息信息
     * 
     * @param index 下标
     * @return
     */
    public EIMMessage getMessage(int index) {
        if (index >= this.messages.size()) {
            EIMLog.e(_TAG, "获取消息信息错误：" + this.messages.size());
            return null;
        }
        EIMMessage message = this.messages.get(index);
        // 如果消息未读，需要将消息标记为已读
        if ((message != null) && (message.isUnread())) {
            message.setUnread(false);
            if (this.unreadMsgCount > 0)
                this.unreadMsgCount -= 1;
        }
        return message;
    }
    
    /**
     * 根据消息的ID获取消息信息
     * 
     * @param msgId 消息ID
     * @return
     */
    public EIMMessage getMessage(String msgId) {
        for (EIMMessage message : this.messages) {
            if (message.getMsgId().equals(msgId)) {
                // 如果消息未读，需要将消息标记为已读
                if (message.isUnread()) {
                    message.setUnread(false);
                    if (this.unreadMsgCount > 0)
                        this.unreadMsgCount -= 1;
                }
                return message;
            }
        }
        return null;
    }
    
    /**
     * 获取会话中的所有消息
     * 
     * @return
     */
    public List<EIMMessage> getAllMessages() {
        return this.messages;
    }
    
    /**
     * 获取某消息在会话消息中的索引下标
     * 
     * @param message 消息
     * @return
     */
    public int getMessagePosition(EIMMessage message) {
        for (EIMMessage tempMessage : this.messages) {
            if (tempMessage.getMsgId().equals(message.getMsgId())) {
                return this.messages.indexOf(tempMessage);
            }
        }
        return -1;
    }
    
    /**
     * 删除消息
     * 
     * @param msgId 消息ID
     */
    public void removeMessage(String msgId) {
        for (EIMMessage tempMessage : this.messages) {
            if (tempMessage.getMsgId().equals(msgId)) {
                // 从会话消息集合中移除
                this.messages.remove(tempMessage);
                // 从数据中删除此条消息
                EIMMessageTable.getInstance().deleteMessage(msgId);
            }
        }
    }
    
    /**
     * 获取最后一条消息信息
     * 
     * @return
     */
    public EIMMessage getLastMessage() {
        if (this.messages.size() == 0) {
            return null;
        }
        return this.messages.get(this.messages.size() - 1);
    }
    
    /**
     * 清空会话消息
     */
    public void clear() {
        this.messages.clear();
        this.unreadMsgCount = 0;
    }
    
    public boolean getIsGroup() {
        return this.isGroup;
    }
    
    public void setGroup(boolean isGroup) {
        this.isGroup = isGroup;
    }
    
    public String getAccount() {
        return this.account;
    }
    
    public EIMUser getOtherUser() {
        return otherUser;
    }
    
    public void setOtherUser(EIMUser otherUser) {
        this.otherUser = otherUser;
    }
    
    /**
     * 获取当前未读消息数量
     * 
     * @return
     */
    public int getUnreadMsgCount() {
        return this.unreadMsgCount;
    }
    
    /**
     * 重置未读消息数量
     */
    public void resetUnreadMsgCount() {
        this.unreadMsgCount = 0;
    }
    
    /**
     * 获取当前会话消息的数量
     * 
     * @return
     */
    public int getMsgCount() {
        return this.messages.size();
    }
    
}
